iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
DevOps

Mac 環境 n8n 30 天學習計畫系列 第 26

Day 26 — 流程設計:畫流程圖與系統設計思考

  • 分享至 

  • xImage
  •  

一、系統總覽

每天早上 08:00 自動抓取 Google Calendar 當日事件 → 格式化成提醒文字 → 根據條件發送 Email 或 Line Notify → 將傳送結果記錄(選擇性:Notion/Google Sheets)。


二|流程圖

flowchart TD
  A[Cron 排程 08:00] --> B[Google Calendar Node: Get Events]
  B --> C[Function: 篩選 & 格式化訊息]
  C --> D{If: 有無行程?}
  D -- True --> E[Email Node: 寄出提醒]
  D -- True --> F[Line Notify: 傳送提醒]
  D -- False --> G[Optional: 寄「今日無行程」或不動作]
  E --> H[Record: Notion/Google Sheets 儲存紀錄]
  F --> H
  H --> I[End]

三|每個節點詳細設計(包含範例設定/code)

1) Cron(排程)

  • 目的:每天固定時間觸發(建議 08:00)。
  • 範例設定:Cron Node → Type: At Date/Time / Daily → Time: 08:00

2) Google Calendar Node(抓當日行程)

  • Credential:Google Calendar OAuth2(已建立)

  • Operation:Get All EventsGet Events

  • 重要參數(n8n expression 範例):

    • Time Min={{ $moment().startOf('day').toISOString() }}
    • Time Max={{ $moment().endOf('day').toISOString() }}
    • 可加 maxResultsorderBystartTime
  • 輸出重點:每個 event 應包含 summary(標題)、start.dateTimestart.dateend.dateTimedescriptionlocation

3) Function Node(處理 & 格式化)

  • 目的:把 events 陣列轉成一段好讀的文字訊息,並回傳 hasEventsmessage
  • 範例程式:
// 假設 Google Calendar 節點輸出 items[0].json.items
const events = items[0].json.items || [];

if (!events.length) {
  return [{ json: { hasEvents: false, message: "今天沒有行程 🎉" } }];
}

let msg = "📅 今日行程提醒:\n\n";
events.forEach(ev => {
  const start = ev.start?.dateTime || ev.start?.date || "時間未定";
  const title = ev.summary || "無標題行程";
  msg += `• ${title} — ${start}\n`;
  if (ev.description) msg += `  備註: ${ev.description}\n`;
});
return [{ json: { hasEvents: true, message: msg } }];

4) If Node(條件判斷)

  • 判斷:{{$json["hasEvents"]}} is true
  • True branch → 進通知節點;False → 可選動作(寄「今日無行程」或不處理)。

5) Email Node(寄信)

  • Credential:SMTP (Gmail / App Password) 或 Gmail OAuth

  • 欄位範例:

    • To: 你的信箱
    • Subject: ={{"【Daily】今日行程提醒:" + $moment().format('YYYY-MM-DD')}}
    • Text: ={{ $json["message"] }}
  • 若想寄 HTML,可用 <br> 格式化。

6) Line Notify(選項)

  • 取得個人或群組 Token(https://notify-bot.line.me/my/)

  • 用 n8n 的 HTTP Request 節點:

    • Method: POST

    • URL: https://notify-api.line.me/api/notify

    • Headers:

      • Authorization: Bearer YOUR_LINE_TOKEN
      • Content-Type: application/x-www-form-urlencoded
    • Body (form-urlencoded): message={{ $json["message"] }}

7) Record(可選:Notion / Google Sheets)

  • 把「日期、是否有行程、傳送狀態、timestamp」儲存下來,方便追蹤與除錯。

四|系統設計思考(重要考量)

A. 權限與認證

  • Google Calendar:需 OAuth2(使用者授權),refresh token 由 n8n 管理。
  • Email:建議用 Gmail App Password 或 OAuth(安全性較高)。
  • Line Notify:使用 Token(注意保管)。

B. 可用性/可恢復性(錯誤處理)

  • Google API 超時或回傳 5xx → 設重試(n8n Execution 有 retry 或在 node 加 try/catch)
  • 若 Email / Line 傳送失敗 → 記錄錯誤(Record node)並可設定重試或發管理者通知。
  • 若 OAuth token 過期 → 導引手動重新授權並記錄原因。

C. 去重(避免重複發送)

  • 儲存已發送的 event id(Notion / Google Sheets / local JSON),比對後跳過已發過的。
  • 如果不想存外部 state,也可在 Function 裡檢查 created 時間和今天的時間策略。

D. 隱私與資料安全

  • 行程通常含私人資訊,不要把完整行程公開推送到公共群組。
  • 儲存時對敏感欄位做遮罩或只保留標題與時間。

E. 預估負載與排程

  • 使用者數量少(單人) → 每日一筆排程即可。
  • 多人使用或多行事曆 → 分批處理或延長 Cron 到每 5 分鐘分批抓取。

F. 日誌與監控

  • 建議在 workflow 裡加入「Record node」儲存每次執行結果(成功或失敗),方便回溯。
  • 使用 n8n 的 Executions 頁面做第一層監控。

上一篇
Day 25:選題 — 決定期末專案主題
下一篇
Day 27|實作 Part 1:收集資料(API / Webhook)與 Debug
系列文
Mac 環境 n8n 30 天學習計畫30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言